home *** CD-ROM | disk | FTP | other *** search
/ Atari Mega Archive 1 / Atari Mega Archive - Volume 1.iso / gnu / progutil / stdwin.zoo / test / charset.c < prev    next >
Encoding:
C/C++ Source or Header  |  1989-10-17  |  2.8 KB  |  167 lines

  1. /* Display character set.
  2.    usage: charset [-font font] [minchar [maxchar]] */
  3.  
  4. #include "tools.h"
  5. #include "stdwin.h"
  6.  
  7. int minchar= 0;            /* First char to draw */
  8. int maxchar= 255;
  9.  
  10. main(argc, argv)
  11.     int argc;
  12.     char **argv;
  13. {
  14.     int *which= &minchar;
  15.     int i;
  16.     
  17.     winitnew(&argc, &argv);
  18.     
  19.     for (i= 1; i < argc; ++i) {
  20.         if (isnumeric(argv[i])) {
  21.             *which= atoi(argv[i]);
  22.             which= &maxchar;
  23.         }
  24.         else
  25.             break;
  26.     }
  27.     if (i < argc) {
  28.         wdone();
  29.         fprintf(stderr, "usage: %s [minchar [maxchar]]\n", argv[0]);
  30.         exit(2);
  31.     }
  32.     
  33.     if (maxchar < minchar) {
  34.         wdone();
  35.         fprintf(stderr, "%s: maxchar < minchar\n", argv[0]);
  36.         exit(2);
  37.     }
  38.     
  39.     setup();
  40.     mainloop();
  41.     wdone();
  42.     exit(0);
  43. }
  44.  
  45. bool
  46. isnumeric(str)
  47.     char *str;
  48. {
  49.     while (*str != EOS) {
  50.         if (!isdigit(*str))
  51.             return FALSE;
  52.         ++str;
  53.     }
  54.     return TRUE;
  55. }
  56.  
  57. WINDOW *win;
  58. int ncols, nrows;
  59. int colwidth, rowheight;
  60.  
  61. void drawproc(win, l, t, r, b)
  62.     WINDOW *win;
  63. {
  64.     int lineheight= wlineheight();
  65.     int i= (t/rowheight) * ncols;
  66.     for (; i <= maxchar-minchar; ++i) {
  67.         int c= minchar+i;
  68.         int col= i%ncols;
  69.         int row= i/ncols;
  70.         int h= col*colwidth;
  71.         int v= row*rowheight;
  72.         int charwidth= wcharwidth(c);
  73.         if (v >= b)
  74.             break;
  75.         wdrawchar(h + (colwidth - charwidth) / 2,
  76.               v + (rowheight - lineheight) / 2,
  77.               c);
  78.     }
  79. }
  80.  
  81. setup()
  82. {
  83.     int scrwidth, scrheight;
  84.     int maxwidth= 1;
  85.     int i;
  86.     
  87.     wgetscrsize(&scrwidth, &scrheight);
  88.     while (minchar <= maxchar && wcharwidth(minchar) == 0)
  89.         ++minchar;
  90.     while (maxchar >= minchar && wcharwidth(maxchar) == 0)
  91.         --maxchar;
  92.     if (minchar > maxchar) {
  93.         wdone();
  94.         fprintf(stderr, "no chars in given range\n");
  95.         exit(1);
  96.     }
  97.     for (i= minchar; i <= maxchar; i++) {
  98.         int w= wcharwidth(i);
  99.         if (w > maxwidth)
  100.             maxwidth= w;
  101.     }
  102.     colwidth= maxwidth * 2;
  103.     rowheight= wlineheight() * 3 / 2;
  104.     ncols= 16;
  105.     if ((ncols+2) * colwidth > scrwidth) {
  106.         ncols= scrwidth/colwidth - 2;
  107.         if (ncols < 1)
  108.             ncols= 1;
  109.     }
  110.     nrows= (maxchar - minchar + ncols) / ncols;
  111.     if (nrows < 1)
  112.         nrows= 1;
  113.     wsetdefwinsize(ncols*colwidth, nrows*rowheight);
  114.     wsetmaxwinsize(ncols*colwidth, nrows*rowheight);
  115.     win= wopen("Character Set", drawproc);
  116.     if (win == NULL) {
  117.         wdone();
  118.         fprintf(stderr, "can't open window\n");
  119.         exit(1);
  120.     }
  121.     (void) wmenucreate(1, "Press q to quit");
  122. }
  123.  
  124. mainloop()
  125. {
  126.     for (;;) {
  127.         EVENT e;
  128.         wgetevent(&e);
  129.         switch (e.type) {
  130.         case WE_CHAR:
  131.             switch (e.u.character) {
  132.             case 'q':
  133.             case 'Q':
  134.                 return;
  135.             }
  136.             break;
  137.         case WE_COMMAND:
  138.             switch (e.u.command) {
  139.             case WC_CANCEL:
  140.             case WC_CLOSE:
  141.                 wclose(win);
  142.                 return;
  143.             }
  144.             break;
  145.         case WE_MOUSE_DOWN:
  146.             charinfo(e.u.where.h, e.u.where.v);
  147.             break;
  148.         }
  149.     }
  150. }
  151.  
  152. charinfo(h, v)
  153.     int h, v;
  154. {
  155.     int row= v/rowheight;
  156.     int col= h/colwidth;
  157.     int i= minchar + row*ncols + col;
  158.     if (i >= minchar && i <= maxchar) {
  159.         char buf[256];
  160.         sprintf(buf, "Char '%c' (%d. 0x%x), width %d",
  161.             i>=' ' && i<0x7f ? i : '?', i, i, wcharwidth(i));
  162.         wmessage(buf);
  163.     }
  164.     else
  165.         wfleep();
  166. }
  167.